#include "ipc/Shm.h"
#include "log.h"

Shm::Shm(const char* path, int id, int tamanio){
    this->tamanio = tamanio;
    this->id = shmget(ftok(path, id), tamanio, IPC_CREAT|0666);
    map();
}

void Shm::map(){
    base = shmat(id, NULL, 0);
}

void Shm::unmap(){
    shmdt(base);
}

void* Shm::getBase(){
    return base;
}

int Shm::getTamanio(){
    return tamanio;
}

void Shm::borrar(){
    if(getBase()){
	log("Shm.borrar(), borro %d bytes\n", getTamanio());
	memset(getBase(), 0, getTamanio()-1);
    }
    else
	log("Se intentó borrar la memoria compartida, pero la base es NULL.\n");
}

Shm::~Shm(){
    unmap();
    //    shmctl(id, IPC_RMID, NULL);
}



Ticketera::Ticketera(const char* path, int id):contador(path, id,sizeof(int)){
}

int Ticketera::siguiente(){
    int* base = (int*) contador.getBase();
    return base[0]++;
}

void Ticketera::reset(){
    int* base = (int*) contador.getBase();
    base[0]=0;
}
